# koroFileHeader at Yungoal acer
# Create: 2021-04-27 13:37:27
# LastEdit: 2021-06-11 12:57:36
"""基本的查询功能
提供文件，读取文件内容作为查询语句
打印查询结果
"""
__author__ = '749B'

import os, sys
BASE_DIR = os.getcwd()
sys.path.append(BASE_DIR)

import argparse
import msrestazure.azure_cloud
# pylint: disable = import-error
from azure_client import Azure_Client
from azure_client import data_format
from utils.env import init_environs
from utils.blueking import job_start, job_success, job_fail

from typing import Optional, List


def get_query(client: Azure_Client, filename: str) -> None:
    """查询并打印结果"""
    query_str = get_query_str(filename)

    # pylint: disable = no-member
    res = client.resource_graph_query_default(
        query_str, 
        [sub.get('subscription_id') for sub in client.get_subscriptions()], 
        )
    # 查询：无结果。
    if not res.data:
        job_success("查询：无结果")
    # UTC转为本地时间
    data_format.parse_time(res.data)
    # 打印结果
    data_format.output_csv(res.data, comma_begin=False)
    print('')
    job_success()

def get_query_str(filename: str) -> str:
    """读取文件，返回文件内容"""        
    with open(os.path.join('query_file', filename)) as file:
        query_str = file.read()
    return query_str

def show_query_files() -> None:
    """打印目录下所有的txt文件"""
    for _, _, files in os.walk('query_file'):
        for index, file in enumerate([f for f in files if os.path.splitext(f)[-1] == '.txt']):
            print('%3s' % str(index + 1), file)

def init_argparse(args: Optional[List[str]] = None) -> argparse.Namespace:
    """初始化：命令行参数"""
    parser = argparse.ArgumentParser(description='根据已经文件中的查询语句查询结果')
    parser.add_argument('filename', nargs='?')
    parser.add_argument('envfile', nargs='?')
    args = parser.parse_args(args)
    return args

def main(args: Optional[List[str]] = None) -> None:
    """主函数"""
    # 初始化命令行参数
    if args is None:
        # 蓝鲸作业平台有BUG，重做的任务，空着的参数里都会被填充null
        args = [arg for arg in sys.argv[1:] if arg != 'null' and not arg.endswith('=null')]
    args = init_argparse(args)
    if not args.filename:
        print("请提供文件名参数，有如下这些可选：")
        return show_query_files()
    if os.path.splitext(args.filename)[-1] != '.txt':
        print("必须提供 .txt 扩展名的文本文件，有如下这些可选：")
        return show_query_files()
    if os.path.split(args.filename)[0]:
        print("只需要文件名，不能指定其他路径，有如下这些可选：")
        return show_query_files()
    if not args.envfile:
        print("请提供存有用户认证信息的env文件的文件名")
        print(f"选择的Query文件 {args.filename} 的请求内容如下：")
        query_str = get_query_str(args.filename)
        print(query_str)
        return

    # 初始化环境变量
    envs = init_environs(args.envfile)
    if not envs:
        return job_fail("env文件解密错误")
    if envs['runtime_env'] == 'blueking':
        for key in args.__dict__.keys():
            if key.startswith('dev_'):
                v = getattr(args, key)
                if v:
                    print(f'{key}={v}: 不支持的命令行参数，已经忽略。', file=sys.stderr)
                    setattr(args, key, None)

    # 实例化客户端
    CLOUD = getattr(msrestazure.azure_cloud, envs['cloud_name'])
    client = Azure_Client(CLOUD)
    
    return get_query(client, args.filename)


if __name__ == '__main__':

    job_start()

    ###### 可在此处开始编写您的脚本逻辑代码
    ###### iJobs中执行脚本成功和失败的标准只取决于脚本最后一条执行语句的返回值
    ###### 如果返回值为0，则认为此脚本执行成功，如果非0，则认为脚本执行失败

    main()
